#include "include/MyHttpServer.h"



// 构造函数
MyHttpServer:: MyHttpServer(std::string host, int port, int thread_pool_num )
        : NIOServer(host, port, thread_pool_num)
{
     // HTTP服务器相关的 初始化mimetype 和 初始化路由
    init_mimetype();
    initViewFunction(); // ALL_VIEW
}


//
int MyHttpServer::unpack_and_pack(char *&buf, int offset, int fd)
{
    // 解包，一次性读完的
    shared_ptr<HqHttpHead> head = make_shared<HqHttpHead>(buf , offset);
    cout << "收到一个请求头:" << endl;
    cout << head->getFirstLine() << endl;
    // 处理函数
    cout << "正在处理:\n"
         << endl;

    HqHttpResHead res;
    auto it = ALL_VIEW.find(head->path);
    if (it != ALL_VIEW.end())
    {
        // 1 调用自定义的函数
        HViewF pfunc = it->second;
        pfunc(*head, res, buf);
    }
    else
    {
        // 2 否则按照静态文件处理
        handle_static_file(*head, res, buf);
    }
    res.headers["Connection"] = "Keep-Alive";

    if (!res.mfs)
    {
        printf(" ! res.mfs 小文件，主线程直接返回，无需送入发送线程池  \n");
        int AllLen = res.getAllData(buf); // 把 返回头 放入buf
        // send数据
        //  printf("%s\n", buf);
        int ret = sendAllData(fd, AllLen, buf); // head + body
        if (ret == -1)
        {
            printf("sendAllData==-1, close fd = %d \n", fd);
            return -1;
        }
    }
    else
    {
        int hLen = res.getAllData(buf); // 把 返回头 放入buf
        // send数据
        int ret = sendAllData(fd, hLen, buf); // head
        if (ret == -1)
        {
            printf("head sendAllData==-1, close fd = %d \n", fd);
            return -1;
        }
        // 添加任务
        printf(" res.mfs  添加任务 \n");
        unique_ptr<HqHttpResHead> rr = make_unique<HqHttpResHead>(move(res));
        unique_ptr<NIOTaskParam> param = make_unique<NIOTaskParam>(fd, rr);
        sendPool->pool_add_work(do_task_for_send_func, param);

        // 自动 ~HqHttpResHead
    }
    printf("该请求处理完毕:connfd=%d\n", fd);
    // close(sock_fd); //如果是connnction=close
    return 0; // 正常
}

void testMyHttpServer(){
    MyHttpServer("0.0.0.0", 8000).startNIOServer();
}